Skip to content

Потокобезопасность. #10

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Aug 31, 2022

Conversation

Nivanchenko
Copy link

Привет. Проблема в том что Ожидаем - модуль, и при параллельной работе с ассертами через ФЗ, вызовы Что(...) затирают друг друга. Не потокобезопасно получается.
Например вот такой тест не пройдет:

Процедура ТестДолжен_Проверить_ОбработкуАссертовВФоновыхЗаданиях() Экспорт
	
	Для Счетчик = 1 по 50 Цикл
		ФоновыеЗадания.Выполнить(ЭтотОбъект, "ГенерацияОбъектовВЦикле");
	КонецЦикла;
	
	Попытка 
		ФоновыеЗадания.ОжидатьЗавершенияЗадач();
		КоличествоОшибок = 0;
	Исключение
		Информация = ИнформацияОбОшибке();
		КоличествоОшибок = Информация.Параметры.Количество();
	КонецПопытки;

	Ожидаем.Что(
			КоличествоОшибок, 
			СтрШаблон("При обработке ассертов в фоновом задании ошибки %1", КоличествоОшибок)
		).Равно(0);

КонецПроцедуры

Процедура ГенерацияОбъектовВЦикле() Экспорт
	Для сч = 1 По 50 Цикл
		ОбъектМассив = Новый Массив();
		Ожидаем.Что(
			ОбъектМассив, 
			СтрШаблон("Проблема в определении значения ""Неопределено"" %1", Сч)
		).Не_().Равно(Неопределено);
	КонецЦикла;
КонецПроцедуры

Для решения я перенес реализацию теста из модуля в отдельный класс. А модуль Ожидаем.Что(...) создает новый инстанс и возвращает его.

Copy link
Member

@nixel2007 nixel2007 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Думаю, по аналогии можно и утверждения разбить.

Перем ФлагОтрицанияДляСообщения;
Перем СтатусыРезультатаТестирования;

Функция Что(Знач ПроверяемоеЗначениеПараметр, Знач Сообщение = "") Экспорт
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Может это просто в конструктор объекта перенести?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Может это просто в конструктор объекта перенести?

00af416
Да кажется логичным. Добавил в конструктор параметры и создание экземпляра в модуле переделал.
Но у класса "Что" оставил. Вдруг у кого-то есть код в духе

Ожидаем.Что(2).Больше(1).Что(2).Не_().Равно(неопределено) ... и т.д.

@Nivanchenko
Copy link
Author

Думаю, по аналогии можно и утверждения разбить.

Ты про https://github.com/oscript-library/asserts/blob/master/src/xunit-asserts.os ? Там вроде нет состояний, которые могут быть затерты соседними потоками.

@nixel2007
Copy link
Member

Ай, я слепой. Снимается)

@EvilBeaver
Copy link
Member

@nixel2007 я одобряю, как будете готовы - жмякните мерж

@nixel2007 nixel2007 merged commit 0480173 into oscript-library:master Aug 31, 2022
@nixel2007
Copy link
Member

@EvilBeaver может ещё и релиз пульнешь?)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants